﻿#ifndef OSS_DLL_H_
#define OSS_DLL_H_
#include "ossType.h"

/**
 *		导出声明
 *@author		吴建凰 2015年11月27日
 */
#ifdef WINDOWS_OS
#if defined( _USRDLL) || defined(DEC_EXPORT)
	#define DLL_API  __declspec(dllexport)  
#else
	#define DLL_API  __declspec(dllimport)  
#endif

#define DLL_EXPORT  __declspec(dllexport)
#define DLL_IMPORT  __declspec(dllexport)
#endif

#ifdef LINUX

#ifdef _USRDLL
#define DLL_API  __attribute__((visibility("default")))
#else
#define DLL_API  __attribute__((visibility("default")))
#endif

#define DLL_EXPORT __attribute__((visibility("default")))
#define DLL_IMPORT  
#endif

OSS_EXTERN_BEG
typedef struct OssVersion_tag
{
    const char*	version;		//版本号
    const char*	name;			//模块名称
    const char*	author;			//创建者
    const char*	date;			//创建日期
    const char*	desc;			//描述，每次修改都需要描述
}OssVersion,*LPOssVersion;


typedef void *DllFun;
/**
 *		加载动态库
 *@pcDllPath	动态库路径
 *@return	成功返回动态库句柄，
 *			失败返回NULL
 */
 Handle OssLoadLibrary(const char* pcDllPath);

/**
 *		释放动态库
 *@hlib		动态库句柄
 *@return	成功返回TRUE
 *			失败返回FALSE
 */
 Bool OssFreeLibrary(Handle hDll);

/**
 *		获取动态库中的函数地址
 *@hDll		动态库句柄
 *@funName	函数名
 *@return	成功返回函数地址
 *			失败返回NULL 
 */
 DllFun OssGetLibraryFun(Handle hDll,const char* funName); 

 /**
 *      获取动态库的错误信息
 */
char* OssGetLibraryError();

OSS_EXTERN_END

template<class T>
class OssDllInstance
{
public:
    OssDllInstance()
    {
        //
    }

    ~OssDllInstance()
    {

    }

    /**
     *      加载指定动态库
     */
    bool LoadInstance(const char* dllPath, const char* createFunctionName, const char* freeFunctionName)
    {
        m_hDll = OssLoadLibrary(dllPath);
        if (m_hDll == nullptr)
        {
            return false;
        }

    }

private:
    Handle m_hDll = nullptr;
    T* m_instance;
};

#endif

